package com.finfosoft.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.finfosoft.bean.Person;
import com.finfosoft.repository.PersonRepsitory;
import com.finfosoft.service.PersonService;
/**
 *缓存 
 *@CachePut 无论怎样，都会将方法的返回值放在缓存中
 *@Cacheable 在方法执行前Spring先查看缓存中是否有数据，如果有数据，则直接返回缓存数据，若没有数据，调用方法并将方法返回值放进缓存
 *@CacheEvict 将一条或者多条数据从缓存中删除
 *三者都有value属性   指定的是要使用的缓存名称，key属性指定的是数据在缓存中的存储的键
 *@Caching 可以通过@Caching注解组合多个注解策略在一个方法上
 *
 */
@Service
public class PersonServiceImpl implements PersonService{

	@Autowired
	PersonRepsitory personRepsitory;
	@CachePut(value="people",key="#p.id")
	public Person save(Person p) {
		Person person = personRepsitory.save(p);
		System.out.println("新增id,key为"+p.getId()+"的数据缓存");
		return person;
	}

	
	@Override
	@CacheEvict(value="people")
	public void remove(long id) {
		System.out.println("删除id,key为"+id+"的数据缓存");
		personRepsitory.delete(id);
		
	}

	@Cacheable(value="people",key="#person.id")
	public Person findOne(Person person) {
		System.out.println("查询id,key为"+person.getId()+"的数据缓存");
		Person p = personRepsitory.findOne(person.getId());
		return p;
	}

	@Transactional(rollbackFor={IllegalArgumentException.class})
	public Person savePersonWithRollBack(Person person){
		
		Person p = personRepsitory.save(person);
		if(p.getName().equals("xiaogou")){
			throw new IllegalArgumentException("该用户已存在,数据回滚");
		}
		return p;
	}
	
	/**
	 * @Transactional  开启事物   rollbackFor属性，指定特定异常时，数据回滚
	 * 						  noRollbackFor属性，指定特定异常时，数据不回滚
	 * 
	 */
	@Transactional(noRollbackFor={IllegalArgumentException.class})
	public Person savePersonWithnoRollbackFor(Person person){
		
		Person p = personRepsitory.save(person);
		if(p.getName().equals("xiaogou")){
			throw new IllegalArgumentException("该用户已存在，数据不回滚");
		}
		return p;
	}
}
